package com.hxrk.cecardvr;

import android.os.Environment;
import android.util.Log;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * Description : 日志工具类
 */
public class LogUtils {
    public static final String TAG = "CECarDvr";
    // 是否打印日志
    public static final boolean is_PrintLog = true;

    // 是否保存到文件
    private static boolean is_SaveToFile = false;

    public static String LOG_FILE = Environment
            .getExternalStorageDirectory().getAbsolutePath() + "/DidiMain/Log/Dvr/";

    //    private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss", Locale.US);//日期格式;
    private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH", Locale.US);//日期格式;

    private static Date date = new Date();//因为log日志是使用日期命名的，使用静态成员变量主要是为了在整个程序运行期间只存在一个.log文件中;

    private static final char VERBOSE = 'v';

    private static final char DEBUG = 'd';

    private static final char INFO = 'i';

    private static final char WARN = 'w';

    private static final char ERROR = 'e';

    public static String getClassInfo(){
        StackTraceElement[] stackTraceElements = new Throwable().getStackTrace();
        if (stackTraceElements[2] != null){

            String className = stackTraceElements[2].getClassName();
            String methodName = stackTraceElements[2].getMethodName();
            int lineNumber = stackTraceElements[2].getLineNumber();

            return /*className + " - " + */methodName + " - " + lineNumber + "\n\n";
        }
        return "";
    }

    public static void v(String message){
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.v(TAG, message);
            if (is_SaveToFile){
                writeToFile(VERBOSE, TAG, message);
            }
        }
    }

    public static void d(String message) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.d(TAG, message);
            if (is_SaveToFile){
                writeToFile(DEBUG, TAG, message);
            }
        }
    }

    public static void i(String message) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.i(TAG, message);
            if (is_SaveToFile){
                writeToFile(INFO, TAG, message);
            }
        }
    }

    public static void w(String message) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.w(TAG, message);
            if (is_SaveToFile){
                writeToFile(WARN, TAG, message);
            }
        }
    }

    public static void e(String message) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.e(TAG, message);
            if (is_SaveToFile){
                writeToFile(ERROR, TAG, message);
            }
        }
    }

    public static void v(String tag, String message) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.v(TAG, message);
            if (is_SaveToFile){
                writeToFile(VERBOSE, TAG, message);
            }
        }
    }

    public static void d(String tag, String message) {
        if(is_PrintLog) {
            message = getClassInfo() + " - " + message;
            Log.d(TAG, message);
            if (is_SaveToFile){
                writeToFile(DEBUG, TAG, message);
            }
        }
    }

    public static void i(String tag, String message) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.i(TAG, message);
            if (is_SaveToFile){
                writeToFile(INFO, TAG, message);
            }
        }
    }

    public static void w(String tag, String message) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.w(TAG, message);
            if (is_SaveToFile){
                writeToFile(WARN, TAG, message);
            }
        }
    }

    public static void e(String tag, String message) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.e(TAG, message);
            if (is_SaveToFile){
                writeToFile(ERROR, TAG, message);
            }
        }
    }

    public static void e(String tag, String message, Exception e) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.e(TAG, message, e);
            if (is_SaveToFile){
                writeToFile(ERROR, TAG, message);
            }
        }
    }

    public static void w(String tag, String message, Exception e) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.w(TAG, message, e);
            if (is_SaveToFile){
                writeToFile(ERROR, TAG, message);
            }
        }
    }

    public static void i(String tag, String message, Exception e) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.i(TAG, message, e);
            if (is_SaveToFile){
                writeToFile(INFO, TAG, message);
            }
        }
    }

    public static void d(String tag, String message, Exception e) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.d(TAG, message, e);
            if (is_SaveToFile){
                writeToFile(DEBUG, TAG, message);
            }
        }
    }

    public static void v(String tag, String message, Exception e) {
        if(is_PrintLog) {
            message = message + "   ----------" + getClassInfo();
            Log.v(TAG, message, e);
            if (is_SaveToFile){
                writeToFile(VERBOSE, TAG, message);
            }
        }
    }


    /**
     * 将log信息写入文件中
     *
     * @param type
     * @param tag
     * @param msg
     */
    private synchronized static void writeToFile(char type, String tag, String msg) {
        // 是否保存日志
        if (!is_SaveToFile)
            return;

        if (null == LOG_FILE) {
            Log.e(TAG, "logPath == null ，未初始化LogToFile");
            return;
        }

        String fileName = LOG_FILE + TAG + "_log_" + dateFormat.format(new Date()) + ".log";//log日志名，使用时间命名，保证不重复
        String log = dateFormat.format(date) + " " + type + " " + tag + " " + msg + "\r\n";//log日志内容，可以自行定制

        //如果父路径不存在
        File file = new File(LOG_FILE);
        if (!file.exists()) {
            file.mkdirs();//创建父路径
        }

        FileOutputStream fos = null;//FileOutputStream会自动调用底层的close()方法，不用关闭
        BufferedWriter bw = null;
        try {

            fos = new FileOutputStream(fileName, true);//这里的第二个参数代表追加还是覆盖，true为追加，flase为覆盖
            bw = new BufferedWriter(new OutputStreamWriter(fos));
            bw.write(log);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bw != null) {
                    bw.close();//关闭缓冲流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}